clc;
clear;

% 定义目标函数
f = @(x1, x2) 7*x1 + 12*x2;

% 绘制约束条件的直线
x1 = linspace(0, 100, 500); % 定义 x1 的范围
x2_1 = (360 - 9*x1) / 4;    % 从约束 9x1 + 4x2 <= 360 得到 x2 的表达式
x2_2 = (200 - 4*x1) / 5;    % 从约束 4x1 + 5x2 <= 200 得到 x2 的表达式
x2_3 = (300 - 3*x1) / 10;   % 从约束 3x1 + 10x2 <= 300 得到 x2 的表达式

% 确保 x2 非负
x2_1(x2_1 < 0) = NaN;
x2_2(x2_2 < 0) = NaN;
x2_3(x2_3 < 0) = NaN;

% 绘制图形
figure;
hold on;
plot(x1, x2_1, 'r', 'DisplayName', '9x_1 + 4x_2 \leq 360');
plot(x1, x2_2, 'g', 'DisplayName', '4x_1 + 5x_2 \leq 200');
plot(x1, x2_3, 'b', 'DisplayName', '3x_1 + 10x_2 \leq 300');

% 填充可行区域
fill_x1 = [0, 0, 40, 45, 0];
fill_x2 = [0, 40, 10, 0, 0];
fill(fill_x1, fill_x2, 'y', 'FaceAlpha', 0.3, 'EdgeColor', 'none', 'DisplayName', 'Feasible Region');

% 找可行点（手动计算交点）
vertices = [
    0, 0;            % 原点
    0, 40;           % x1 = 0, x2 = 40 (来自约束2)
    40, 10;          % 交点 (约束1和约束2)
    45, 0;           % x1 = 45, x2 = 0 (来自约束1)
];

% 绘制可行点
scatter(vertices(:, 1), vertices(:, 2), 'filled', 'k', 'DisplayName', 'Vertices');

% 计算每个顶点的目标函数值
values = arrayfun(@(i) f(vertices(i, 1), vertices(i, 2)), 1:size(vertices, 1));
disp('目标函数值：');
disp(values);

% 标记顶点和目标函数值
for i = 1:size(vertices, 1)
    text(vertices(i, 1), vertices(i, 2), sprintf('(%d, %d)\\nZ=%.2f', vertices(i, :), values(i)), ...
        'HorizontalAlignment', 'left', 'VerticalAlignment', 'bottom');
end

% 标注
legend;
xlabel('x_1');
ylabel('x_2');
title('线性规划图解法');
grid on;
hold off;

% 打印最优解
[max_value, idx] = max(values);
disp('最优解：');
disp(['x1 = ', num2str(vertices(idx, 1)), ', x2 = ', num2str(vertices(idx, 2)), ', Z = ', num2str(max_value)]);
